package com.chukun.interview.feature.record;

import com.chukun.interview.feature.inf.impl.Circle03;
import com.chukun.interview.feature.inf.impl.Circle04;
import com.chukun.interview.feature.inf.impl.Square02;

/**
 * @author chukun
 * @version 1.0.0
 * @description java新特性: 档案类
 *   档案类在 JDK 16正式发布
 *
 *   档案类的出现，就是为了解决不可变对象代码臃肿的问题
 *
 *   Java 档案类以下的限制:
 *   1、Java 档案类不支持扩展子句，用户不能定制它的父类。隐含的，它的父类是 java.lang.Record。父类不能定制，也就意味着不能通过修改父类来影响 Java 档案的行为。
 *   2、Java 档案类是个终极（final）类，不支持子类，也不能是抽象类。没有子类，也就意味着不能通过修改子类来改变 Java 档案的行为。
 *   3、Java 档案类声明的变量是不可变的变量。这就是我们前面反复强调的，一旦实例化就不能再修改的关键所在。
 *   4、Java 档案类不能声明可变的变量，也不能支持实例初始化的方法。这就保证了，我们只能使用档案类形式的构造方法，避免额外的初始化对可变性的影响。
 *   5、Java 档案类不能声明本地（native）方法。如果允许了本地方法，也就意味着打开了修改不可变变量的后门。
 *
 *   如何在档案类的构造方法里面加校验?
 *    {@link Circle04}
 *
 *    public Circle04 {
 *         if (radius < 0) {
 *             throw new IllegalArgumentException("The radius of a circle cannot be negative [" + radius + "]");
 *         }
 *     }
 *
 *
 *
 *
 * @see Circle04
 * @see Square02
 *
 * @createTime 2022年06月05日 20:21:00
 */
public class RecordTemplate {

    public static void main(String[] args) {

        // 普通对象
        Circle03 circle01 = new Circle03(10.0d);
        Circle03 circle02 = new Circle03(10.0d);

        System.out.println("普通对象是否相等: circle01 == circle02 : " + circle01.equals(circle02));


        // 使用 圆形的档案类
        Circle04 circle04 = new Circle04(10.0d);
        Circle04 circle05 = new Circle04(10.0d);

        // 档案对象 : 不需要重写equals 方法和 hashCode 方法，天然相等，这也与不可变对象设计的初衷相符
        // 但是对于一些特定类型的参数，还是不相等，例如不可变的变量是一个数组，这是因为数组变量没有重写 equals 方法
        System.out.println("档案对象是否相等: circle04 == circle05 : " + circle04.equals(circle05));


        System.out.println(circle04.getArea());


        // 使用 正方形的档案类
        Square02 square02 = new Square02(10.0d);
        System.out.println(square02.getArea());
    }


}















